package com.qiyun.asyncarrange;


import org.apache.tomcat.jni.Thread;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.concurrent.*;

@RunWith(SpringRunner.class)
public class AsyncarrangeApplicationTests02 {

    @Test
    public void contextLoads() throws ExecutionException, InterruptedException, TimeoutException {
        /**
         * 01.线程池创建 Executors （原生创建线程池）
         * 七大参数
         *      int corePoolSize: 核心线程数：线程池创建好以后就准备就绪的线程数量。
         *      int maximumPoolSize: 最大线程数，表示一个线程池创建过程中最大拥有的线程的数量。
         *      long keepAliveTime: 线程空闲时存活时间，表示一个线程在空闲的时候如果超过空闲时存活时间，那么这个线程有可能被销毁（核心线程除外）
         *      TimeUnit unit: 顾名思义，表示空闲时存活时间的单位
         *      BlockingQueue<Runnable> workQueue: 任务队列。被提交但尚未执行的任务存放在这里
         *      ThreadFactory threadFactory: 线程工厂。用于生成线程池中工作线程的工厂，用于创建线程，一般使用默认的即可
         *      RejectedExecutionHandler handler: 拒绝策略。当队列满了，并且工作线程已经达到maximumPoolSize时，如何拒绝请求执行的Runnable的策略。
         *
         *  工作顺序：
         *      1.创建线程池，准备好core数量的核心线程，准备接受任务
         *      2.core满了，就将再进来的任务放入阻塞队列中。空闲的core去阻塞队列获取任务执行
         *      3.阻塞队列满了，就直接开新线程执行，最大只能开到max指定的数量
         *      4.max满了就用RejectedExexutionHandler拒绝任务。
         *      5.max都执行完成，有很多空闲线程，在指定的时间keepAliveTime以后，释放max-core这些线程。
         *
         *          new LinkedBlockingDeque<>():默认是Integer的最大值。可能会导致内存不够
         *
         *       一个线程core 7； max  20   ；queue:50    100并发进来怎么分配；
         *       7个会立即得到执行，50个会进入队列，再开13个进行执行。剩下的30个就使用拒绝策略。
         */
        ThreadPoolExecutor executor = new ThreadPoolExecutor(5,
                200,
                10,
                TimeUnit.SECONDS,
                new LinkedBlockingDeque<>(100000),
                Executors.defaultThreadFactory(),//默认线程工厂
                new ThreadPoolExecutor.AbortPolicy()//拒绝策略
                //如果不想抛弃还要执行。可以使用new ThreadPoolExecutor.CallerRunsPolicy()
        );


    }

}
